package br.com.megaacerto.negocio;

import java.math.BigDecimal;
import java.util.Date;

import org.jrimum.bopepo.BancosSuportados;
import org.jrimum.bopepo.Boleto;
import org.jrimum.bopepo.campolivre.CLCecred;
import org.jrimum.bopepo.parametro.ParametroCaixaEconomicaFederal;
import org.jrimum.domkee.comum.pessoa.endereco.CEP;
import org.jrimum.domkee.comum.pessoa.endereco.Endereco;
import org.jrimum.domkee.comum.pessoa.endereco.UnidadeFederativa;
import org.jrimum.domkee.financeiro.banco.ParametrosBancariosMap;
import org.jrimum.domkee.financeiro.banco.febraban.Agencia;
import org.jrimum.domkee.financeiro.banco.febraban.Carteira;
import org.jrimum.domkee.financeiro.banco.febraban.Cedente;
import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria;
import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta;
import org.jrimum.domkee.financeiro.banco.febraban.Sacado;
import org.jrimum.domkee.financeiro.banco.febraban.SacadorAvalista;
import org.jrimum.domkee.financeiro.banco.febraban.TipoDeTitulo;
import org.jrimum.domkee.financeiro.banco.febraban.Titulo;
import org.jrimum.domkee.financeiro.banco.febraban.Titulo.Aceite;

import br.com.megaacerto.dto.BoletoDTO;

public class PagamentoBU {

	public Boleto gerarBoleto(BoletoDTO boletoDTO){
		
		Cedente cedente = new Cedente(boletoDTO.getCedente(), boletoDTO.getCedenteCnpj());
		
		Sacado sacado = new Sacado(boletoDTO.getSacado(), boletoDTO.getSacadoCpf());

		// Informando o endere�o do sacado.
		Endereco enderecoSac = new Endereco();
		enderecoSac.setUF(UnidadeFederativa.RN);//Alterar TODO
		enderecoSac.setLocalidade(boletoDTO.getEnderecoSacLocalidade());
		enderecoSac.setCep(new CEP(boletoDTO.getEnderecoSacCep()));
		enderecoSac.setBairro(boletoDTO.getEnderecoSacBairro());
		enderecoSac.setLogradouro(boletoDTO.getEnderecoSacLogradouro());
		enderecoSac.setNumero(boletoDTO.getEnderecoSacNumero());
		sacado.addEndereco(enderecoSac);
		
//		SacadorAvalista sacadorAvalista = new SacadorAvalista("JRimum Enterprise", "00.000.000/0001-91");
//
//		// Informando o endere�o do sacador avalista.
//		Endereco enderecoSacAval = new Endereco();
//		enderecoSacAval.setUF(UnidadeFederativa.DF);
//		enderecoSacAval.setLocalidade("Bras�lia");
//		enderecoSacAval.setCep(new CEP("59000-000"));
//		enderecoSacAval.setBairro("Grande Centro");
//		enderecoSacAval.setLogradouro("Rua Eternamente Principal");
//		enderecoSacAval.setNumero("001");
//		sacadorAvalista.addEndereco(enderecoSacAval);

		// Informando dados sobre a conta banc�ria do t�tulo.
		ContaBancaria contaBancaria = new ContaBancaria(BancosSuportados.CAIXA_ECONOMICA_FEDERAL.create());
		contaBancaria.setNumeroDaConta(new NumeroDaConta(new Integer(boletoDTO.getContaBancariaNumeroDaConta()), boletoDTO.getContaBancariaAgenciaDigito()));
//		contaBancaria.setCarteira(new Carteira(new Integer(boletoDTO.getContaBancariaCarteira())));
		contaBancaria.setCarteira(new Carteira(8));
		contaBancaria.setAgencia(new Agencia(new Integer(boletoDTO.getContaBancariaAgencia()), boletoDTO.getContaBancariaAgenciaDigito()));
		
		Titulo titulo = new Titulo(contaBancaria, sacado, cedente);
		titulo.setNumeroDoDocumento(boletoDTO.getTituloNumeroDoDocumento());
//		titulo.setNossoNumero(boletoDTO.getTituloNossoNumero());
		titulo.setNossoNumero("12345678912345");
		titulo.setDigitoDoNossoNumero(boletoDTO.getTituloDigitoDoNossoNumero());
		titulo.setValor(BigDecimal.valueOf(new Double(boletoDTO.getValor())));
		titulo.setDataDoDocumento(new Date());// TODO
		titulo.setDataDoVencimento(new Date());// TODO
		titulo.setTipoDeDocumento(TipoDeTitulo.DM_DUPLICATA_MERCANTIL);//??? TODO
		titulo.setAceite(Aceite.A);//?? TODO
//		titulo.setDesconto(new BigDecimal(0.05));//REMOVER TODO
//		titulo.setDeducao(BigDecimal.ZERO);//REMOVER TODO
//		titulo.setMora(BigDecimal.ZERO);
//		titulo.setAcrecimo(BigDecimal.ZERO);
//		titulo.setValorCobrado(BigDecimal.ZERO);
		
		
		Boleto boleto = new Boleto(titulo);
        boleto.setLocalPagamento("Pagável preferencialmente na Rede X ou em " +
	                                "qualquer Banco até o Vencimento.");
	                boleto.setInstrucaoAoSacado("Senhor sacado, sabemos sim que o valor " +
	                                "cobrado não o esperado, aproveite o DESCONTO!");
	                boleto.setInstrucao1("PARA PAGAMENTO 1 até Hoje não cobrar nada!");
	                boleto.setInstrucao2("PARA PAGAMENTO 2 até Amanhã Não cobre!");
	                boleto.setInstrucao3("PARA PAGAMENTO 3 até Depois de amanhã, OK, não cobre.");
	                boleto.setInstrucao4("PARA PAGAMENTO 4 até 04/xx/xxxx de 4 dias atrás " +
	                                "COBRAR O VALOR DE: R$ 01,00");
	                boleto.setInstrucao5("PARA PAGAMENTO 5 até 05/xx/xxxx COBRAR O VALOR " +
	                                "DE: R$ 02,00");
	                boleto.setInstrucao6("PARA PAGAMENTO 6 até 06/xx/xxxx COBRAR O VALOR " +
	                                "DE: R$ 03,00");
	                boleto.setInstrucao7("PARA PAGAMENTO 7 até xx/xx/xxxx COBRAR O VALOR " +
	                                "QUE VOCÊ QUISER!");
	                boleto.setInstrucao8("APÓS o Vencimento, Pagável Somente na Rede X.");
	
	               
	                // Adicionando novos campos ao boleto...
	                boleto.addTextosExtras("txtEnvSacado1", "CLIENTE TESTE (Algum Sacado)");
	                boleto.addTextosExtras("txtEnvSacado2", "RUA TESTE, 999");
	                boleto.addTextosExtras("txtEnvSacado3", "17506-970  MARÍLIA-SP");
	               
	                               
	                boleto.addTextosExtras("txtRsNumeroFatura", "111");
	                boleto.addTextosExtras("txtRsSacado2", "MAIS DADOS SOBRE O SACADO...");
	               
	                /*
140	                 * Detalhando a Fatura:
141	                 * Uma coleção de dados que pode vir de um banco de dados ou
142	                 * de qualquer outro lugar.
143	                 */
//	                List<ItemFaturaBoletoSICREDI> listaDetalhadaDaFatura = new ArrayList<ItemFaturaBoletoSICREDI>();
//	               
//	                listaDetalhadaDaFatura.add(new ItemFaturaBoletoSICREDI("Produto A","11/01/2008","S.A","2","R$ 140,00"));
//	                listaDetalhadaDaFatura.add(new ItemFaturaBoletoSICREDI("Produto B","01/02/2008","S.B","3","R$ 23,00"));
//	                listaDetalhadaDaFatura.add(new ItemFaturaBoletoSICREDI("Produto C","15/04/2008","S.C","14","R$ 320,00"));
//	                listaDetalhadaDaFatura.add(new ItemFaturaBoletoSICREDI("Produto D","20/05/2008","S.D","1","R$ 410,00"));
//	                listaDetalhadaDaFatura.add(new ItemFaturaBoletoSICREDI("Produto E","27/06/2008","S.E","10","R$ 500,00"));
	               
	                /*
153	                 *Um TextArea para cada coluna do detalhamento da fatura.
154	                 *Eh necessário declarar uma nova linha para cada item novo em uma coluna.
155	                 */
	                StringBuilder sbProduto = new StringBuilder();
	                StringBuilder sbData = new StringBuilder();
	                StringBuilder sbServico = new StringBuilder();
	                StringBuilder sbQuantidade = new StringBuilder();
	                StringBuilder sbValor = new StringBuilder();
	               
	                final String NOVA_LINHA = "\n";
	                boleto.getTitulo().setParametrosBancarios(new ParametrosBancariosMap(ParametroCaixaEconomicaFederal.CODIGO_OPERACAO, 870));

//	                for(ItemFaturaBoletoSICREDI item : listaDetalhadaDaFatura){
//	                       
//	                        sbProduto.append(item.produto + NOVA_LINHA); 
//	                        sbData.append(item.data + NOVA_LINHA);
//	                        sbServico.append(item.servico + NOVA_LINHA); 
//	                        sbQuantidade.append(item.quantidade + NOVA_LINHA);
//	                        sbValor.append(item.valor + NOVA_LINHA);
//	                       
//	                }
	               
	                boleto.addTextosExtras("txtRsListagemNome", sbProduto.toString());
	                boleto.addTextosExtras("txtRsListagemData", sbData.toString());
	                boleto.addTextosExtras("txtRsListagemServico", sbServico.toString());
	                boleto.addTextosExtras("txtRsListagemQtde", sbQuantidade.toString());
	                boleto.addTextosExtras("txtRsListagemValor", sbValor.toString());
	               
	                /*
181	                 * Campos específicos do SICREDI para ficha de compensação
182	                 */
	               
	                boleto.addTextosExtras("txtFcNomeCarteira", "SIMPLES");
	               
	               
	                //FORMATAÇÃO: AAAA.PP.CCCCC
	                boleto.addTextosExtras("txtFcAgenciaCodigoCedentePosto", "12.34.56789");
					return boleto;
	}
	
}
